`define CNT1_ge data[4]
`define CNT1_shi data[3]
`define CNT2_ge data[7]
`define CNT2_shi data[6]
`define TIMER_ge data[1]
`define TIMER_shi data[0]

module Top (
    input logic clk, //时钟信号，50MHz
    input logic rst, //复位信号，高电平有效
    input logic s1, //低电平有效，按下s1，计数器1的值+1
    input logic s2,//低电平有效，按下s2，计数器2的值+1
    input logic s3,//低电平有效，按下s3，切换定时器启动、停止状态
    output logic LD1,//低电平有效
    output logic[7:0] seg_sel, //数码管位选信号
    output logic[7:0] seg_data //数码管段选信号

);


//声明

//时钟分频模块信号声明
logic clk_led;
logic clk_scan;
logic clk_debounce;
logic clk_timer;

//按键消抖模块信号声明
logic s1_debounced;
logic s2_debounced;
logic s3_debounced;

//七段数码管模块信号声明
logic [4:0] data [0:7]; 
logic LD1_reg = 1; // 寄存器存储状态

//计数器模块
logic counter_en;

//定时器模块声明
logic [1:0] state;

//初始化
initial begin
    data = '{5'd2, 5'd0, 5'd21, 5'd0, 5'd0, 5'd22, 5'd0, 5'd0}; // "20 00-00"
    state = 2'b01;
    LD1 <= 1'b1;
end

/*
分频模块：
一、对于LD1，亮、灭间隔0.1s，需要分频,0.1s/0.00000002s=5_000_000
二、对于数码管，需要给出频率为1kHz的扫描信号，50_000
*/
//分频模块实例化
clkDiv clkdiv_inst (
    .clk(clk),
    .clk_led(clk_led),
    .clk_scan(clk_scan),
    .clk_debounce(clk_debounce),
    .clk_timer(clk_timer)
);



//按键消抖模块实例化
//debounce模块的输入信号为s1、s2、s3（低电平有效），输出信号为s1_debounced、s2_debounced、s3_debounced(高电平有效)
Debounce debounce_s1(
    .clk(clk),
    .rst(rst),
    .button_in(s1),
    .button_out(s1_debounced)
);

Debounce debounce_s2(
    .clk(clk),
    .rst(rst),
    .button_in(s2),
    .button_out(s2_debounced)
);

Debounce debounce_s3(
    .clk(clk),
    .rst(rst),
    .button_in(s3),
    .button_out(s3_debounced)
);

/*
计数器模块功能：
1.按下按键，计数器的值+1
2.一直加到99，然后变成1
3.只有在定时器处于启动状态的时候才能使用该功能

输入信号：clk、rst、en（定时器处于启动状态时使能）、button
输出信号：ge(个位数)、shi(十位数)
*/
//计数器模块实例化
Counter counter1 (
    .clk       (clk),
    .rst       (rst),
    .button    (s1_debounced),
    .en         (counter_en),
    .ge     (`CNT1_ge),
    .shi    (`CNT1_shi)
);

Counter counter2 (
    .clk       (clk),
    .rst       (rst),
    .button    (s2_debounced),
    .en         (counter_en),
    .ge     (`CNT2_ge),
    .shi    (`CNT2_shi)
);


//七段数码管显示模块实例化
Display display_inst (
    .clk_1k    (clk_scan),      // 连接分频后的1kHz时钟 
    .rst     (rst),   // 与系统复位同步 
    .en        (1'b1),        // 常使能
    .data      (data),  // 显示"20 00-00"
    .decimal   ('0),// 不显示小数点
    .seg_sel   (seg_sel),     // 连接ULN2003等位选驱动 
    .seg_data  (seg_data)     // 连接74HC595串行输入 
);




/*
定时器模块功能：
1.上电时显示20，且处于暂停状态，此时led灭
2.按下s3后切换为启动状态，且led亮
3.启动状态期间按下s3后为暂停状态，led闪烁
4.倒计时结束后led灭，定时器清零

输入信号：clk_1Hz、rst、s3
输出信号：state_out


*/
Timer timer_inst(
    .clk(clk),
    .clk_1Hz(clk_timer),
    .rst(rst),
    .s3(s3_debounced),
    .counter_en(counter_en),
    .state_out(state),
    .ge(`TIMER_ge),
   .shi(`TIMER_shi)
);

/*
LED控制模块
*/
Led led_inst(
    .clk_led(clk_led), // 10Hz时钟（周期0.1s）
    .rst(rst),
    .state(state),
    .led(LD1)
);

endmodule